package dht.data;

import java.io.Serializable;
import java.math.BigInteger;
import java.net.InetAddress;
import java.util.ArrayList;
import java.util.HashMap;
import dht.tools.Couple;

/**
 * La classe Contexte représente l'environnement d'un noeud pour qu'il puisse
 * fonctionner dans le reseau.
 * @author bouceka
 *
 */
public class Contexte implements Serializable {


	private static final long serialVersionUID = -5204521411399824347L;
	private ArrayList<Couple<BigInteger>> zoneLocale; 
	private HashMap<TabBigInteger, DhtData<Integer>> dhtLocale;
	private ArrayList<ArrayList<Couple<String>>> voisinage;
	private String virtualID;
	private InetAddress adresseIP;
	
	public Contexte(ArrayList<Couple<BigInteger>> zoneLocale,
			HashMap<TabBigInteger, DhtData<Integer>> dhtLocale,
			ArrayList<ArrayList<Couple<String>>> voisinage, 
			String virtualID,
			InetAddress adresseIP) {

		super();
		this.zoneLocale = zoneLocale;
		this.dhtLocale = dhtLocale;
		this.voisinage = voisinage;
		this.virtualID = virtualID;
		this.adresseIP = adresseIP;
	}

	public ArrayList<Couple<BigInteger>> getZoneLocale() {
		return zoneLocale;
	}

	public void setZoneLocale(ArrayList<Couple<BigInteger>> zoneLocale) {
		this.zoneLocale = zoneLocale;
	}

	public HashMap<TabBigInteger, DhtData<Integer>> getDhtLocale() {
		return dhtLocale;
	}

	public void setDhtLocale(
			HashMap<TabBigInteger, DhtData<Integer>> dhtLocale) {
		this.dhtLocale = dhtLocale;
	}

	public ArrayList<ArrayList<Couple<String>>> getVoisinage() {
		return voisinage;
	}

	public void setVoisinage(ArrayList<ArrayList<Couple<String>>> voisinage) {
		this.voisinage = voisinage;
	}

	public String getVirtualID() {
		return virtualID;
	}

	public void setVirtualID(String virtualID) {
		this.virtualID = virtualID;
	}

	public InetAddress getAdresseIP() {
		return adresseIP;
	}

	public void setAdresseIP(InetAddress adresseIP) {
		this.adresseIP = adresseIP;
	}

	// pas optimise osef :)
	public String toString(){
		int i = 0, k = 0;
		String resultat = "";

		resultat += "-- Contexte --\n\n=====\nZone Locale : ";

		for (Couple<BigInteger> elem : this.zoneLocale) {
			resultat += "\nDimension " + (++i) + "\n\tmin : " + elem.getElem1() + "\n\tmax : " + elem.getElem2();
		} 

		resultat += "\n\n=====\nDht Locale : " + this.dhtLocale.size() + " element(s)\n\n=====\n";

		i = 0;
		
		for(ArrayList<Couple<String>> listeVoisin : this.voisinage){
			
			if(k%2 == 0){
				resultat += "\n-Dimension " + i + " :\n";
				i++;
			}
			
			for (Couple<String> elem : listeVoisin){
				if(elem != null)
					resultat += "Voisin " + " -> vid : " + elem.getElem1() + ", adrr : " + elem.getElem2() + "\n";
			}
			k++;
		}

		resultat += "\n\n-- Mon Virtual ID : " + this.virtualID + "\n" + "-- Mon Adresse IP : " + this.adresseIP + "\n";

		return resultat;
	}
}
